package com.example.NIO;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 优点
 * 1.可以让文件直接在内存中修改，操作系统层面的，不需要拷贝（卧槽？这就是 netty的0拷贝）
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws IOException {
        File file = FileUtil.newFile("1.txt");
        FileUtil.initFile(file, "123456789");
        RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");
        // 获取对应的文件通道
        FileChannel channel = randomAccessFile.getChannel();

        /**
         * 参数一 FileChannel.MapMode.READ_WRITE： 使用读写模式
         * 参数二 0 ：可以修改的起始位置
         * 参数三 5 ：映射到内存的大小（不是索引位置），将文件 1.txt 的多少个字节映射到内存
         *  可以直接修改的范围就是 0 ~ 5
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) '9');
        mappedByteBuffer.put(3, (byte) '9');

        ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length());

        channel.read(byteBuffer);
        byteBuffer.flip();
        CharBuffer charBuffer = byteBuffer.asCharBuffer();
        System.out.println(charBuffer); // 输出为乱码
        randomAccessFile.close();
        channel.close();
        file.delete();
    }
}
